/**
 * 需求:分别编写两个对象，一个是学生对象，另外一个是教师对象
 * 学生对象：学生的姓名、学生的年龄、学生电话
 * 教师对象：教师的姓名、教师的年龄、教师的电话
 */
// type PersonType={name:string,age:number,phone:string}
// let sp1:PersonType={name:'李伟杰',age:22,phone:'132098987878'}
// let tp1:PersonType={name:'张三丰',age:45,phone:'133545454549'}
//可以使用接口来完成
/*
    一、接口的定义
    1、语法
    interface 接口名{
        属性1:类型1
        属性2：类型2
    }
    说明：
    1）使用关键字interface来定义接口的
    2）接口名：每个首字母大写，符合驼峰式命名法
    3) 接口定义后，就形成一个新的数据类型，这种类型在使用的时候直接通过接口名直接调用
    4）建议不要在每个属性的后面添加上分号
    2、接口中属性的特征
    1）可选属性:使用?
    2) 只读属性
    3) 任意属性
    3、接口和函数
    1）使用接口约束函数的参数类型
    function 函数名(参数:接口类型){

    }
    2）使用接口约束函数的返回值类型
    function 函数名(参数:接口类型):接口的返回类型{

    }
    3）使用接口约束函数本身
    interface 接口名{
        (参数：参数类型标注,参数2：参数2类型标注):函数的返回类型
    }
*/
type PhoneType=string|number
interface PersonType{
    readonly idcard:string
    name:string
    age:number
    hobby?:string
    phone:PhoneType,
    [propertyName:string]:any
}
let sp1:PersonType={idcard:'610166198808096787',name:'李伟杰',age:23,phone:'132098987878',hobby:'学习,打游戏'}
let sp2:PersonType={idcard:'610166198808096782',name:'张三',age:44,phone:'13345678987'}
let sp3:PersonType={idcard:'610166198808096786',name:'李四',age:26,phone:'132098987875',hobby:'睡觉',height:'180cm',score:98}

console.log(sp1);
sp1.name="李伟"
//sp1.idcard="610166198808096788"
console.log(sp1);
console.log('--------------------接口参数---------------------------');
function introduce1(person:PersonType){
}
introduce1(sp1)
console.log('--------------------接口返回值类型约束---------------------------');
let ary:Array<PersonType>=[]
function addPerson(person:PersonType):Array<PersonType>{
    ary.push(person) 
    return ary
}


interface Fn1Type{
    (arg1:string,arg2:number):number
}

const fn11:Fn1Type=(arg1,arg2)=>~~arg1+arg2

fn11("11",23)



